home *** CD-ROM | disk | FTP | other *** search
-
- // Copyright (C) 2002 by Luigi Pino. All Rights Reserved.
-
- /***************************************************************************/
-
- #include "../library/neurosis.h"
- #include "draw.h"
- #include "file_io.h"
- #include "hiscore.h"
- #include "initialize.h"
- #include "main.h"
- #include "menu_misc.h"
- #include "paddle.h"
- #include "sphere.h"
- #include "update.h"
-
- /***************************************************************************/
-
- extern Object3_Class sphere[];
- extern Paddle_Struct paddle_object[];
- extern Sphere_Control_Struct sphere_object[];
- extern Timing_Class timing;
- extern Values_Struct values;
-
- extern float3 wall_pts[];
- extern int goal_by_team;
-
- /***************************************************************************/
-
- void Check_Closest_Points_Sphere(Movement_Struct *object)
-
- {
- int x1;
-
- object->collision.distance = 2000.0f;
-
- // Boards
- for (x1=1;x1<49;x1=x1+1)
- Get_Closest_Point_2D(&wall_pts[x1], &wall_pts[x1 + 1], object, -1);
-
- for (x1=Up;x1<=Right;x1=x1+1)
- {
- if (paddle_object[x1].game_over == false)
- {
- float3 temp_from;
- float3 temp_to;
-
- temp_from.x = paddle_object[x1].pts[0].x + paddle_object[x1].movement.current.x;
- temp_from.y = paddle_object[x1].pts[0].y + paddle_object[x1].movement.current.y;
- temp_to.x = paddle_object[x1].pts[1].x + paddle_object[x1].movement.current.x;
- temp_to.y = paddle_object[x1].pts[1].y + paddle_object[x1].movement.current.y;
- Get_Closest_Point_2D(&temp_from, &temp_to, object, -1);
-
- temp_from.x = paddle_object[x1].pts[1].x + paddle_object[x1].movement.current.x;
- temp_from.y = paddle_object[x1].pts[1].y + paddle_object[x1].movement.current.y;
- temp_to.x = paddle_object[x1].pts[2].x + paddle_object[x1].movement.current.x;
- temp_to.y = paddle_object[x1].pts[2].y + paddle_object[x1].movement.current.y;
- Get_Closest_Point_2D(&temp_from, &temp_to, object, -1);
-
- temp_from.x = paddle_object[x1].pts[2].x + paddle_object[x1].movement.current.x;
- temp_from.y = paddle_object[x1].pts[2].y + paddle_object[x1].movement.current.y;
- temp_to.x = paddle_object[x1].pts[3].x + paddle_object[x1].movement.current.x;
- temp_to.y = paddle_object[x1].pts[3].y + paddle_object[x1].movement.current.y;
- Get_Closest_Point_2D(&temp_from, &temp_to, object, -1);
-
- temp_from.x = paddle_object[x1].pts[3].x + paddle_object[x1].movement.current.x;
- temp_from.y = paddle_object[x1].pts[3].y + paddle_object[x1].movement.current.y;
- temp_to.x = paddle_object[x1].pts[0].x + paddle_object[x1].movement.current.x;
- temp_to.y = paddle_object[x1].pts[0].y + paddle_object[x1].movement.current.y;
- Get_Closest_Point_2D(&temp_from, &temp_to, object, -1);
- }
- }
- }
-
- /***************************************************************************/
-
- void Goal_Scored(int current_sphere)
-
- {
- int x1;
-
- if (sphere_object[current_sphere].goal == true)
- {
- if (sphere_object[current_sphere].seconds_left == -1.0f)
- {
- Initialize_Sphere_Object(current_sphere);
- sphere_object[current_sphere].seconds_left = 3.0f;
- sphere_object[current_sphere].movement.direction = Get_Random(360.0f);
-
- for (x1=Up;x1<=Right;x1=x1+1)
- {
- if ((values.game_type != Countdown) && (goal_by_team == x1) && (values.game_end_fade != true))
- {
- paddle_object[x1].score = paddle_object[x1].score + 1.0f;
-
- if (paddle_object[x1].time_lapse > paddle_object[x1].time_lapse_score)
- paddle_object[x1].time_lapse_score = paddle_object[x1].time_lapse;
-
- paddle_object[x1].time_lapse = 0.0f;
- }
- }
- }
- else
- {
- sphere_object[current_sphere].seconds_left = sphere_object[current_sphere].seconds_left - timing.Get_Scale();
- sphere_object[current_sphere].movement.direction = sphere_object[current_sphere].movement.direction + (250.0f * timing.Get_Scale());
- Fix_Angle(&sphere_object[current_sphere].movement.direction);
- }
-
- if (sphere_object[current_sphere].seconds_left <= 0.0f)
- {
- sphere_object[current_sphere].goal = false;
- sphere_object[current_sphere].seconds_left = -1.0f;
-
- sphere_object[current_sphere].movement.direction = sphere_object[current_sphere].movement.direction - 270.0f;
- sphere_object[current_sphere].movement.speed = values.sphere_speed;
- }
- }
- }
-
- /***************************************************************************/
-
- void Initialize_Sphere_Object(int current_sphere)
-
- {
- sphere[current_sphere].Load_Model("Data/sphere.dat", t_sphere);
-
- if (values.game_type == Timed)
- {
- values.sphere_speed = 250.0f;
- sphere_object[current_sphere].goal = true;
- sphere_object[current_sphere].seconds_left = -1.0f;
- sphere_object[current_sphere].movement.direction = Get_Random(360.0f);
- sphere_object[current_sphere].movement.collision.radius = Sphere_Radius;
-
- if (current_sphere == 0)
- {
- sphere_object[0].movement.current.x = -40.0f;
- sphere_object[0].movement.current.y = -40.0f;
- sphere_object[0].movement.current.z = Sphere_Radius;
- sphere_object[0].movement.speed = 0.0f;
- sphere[0].Move(&sphere_object[0].movement.current);
- }
- else if (current_sphere == 1)
- {
- sphere_object[1].movement.current.x = 0.0f;
- sphere_object[1].movement.current.y = 0.0f;
- sphere_object[1].movement.current.z = Sphere_Radius;
- sphere_object[1].movement.speed = 0.0f;
- sphere[1].Move(&sphere_object[1].movement.current);
- }
- else if (current_sphere == 2)
- {
- sphere_object[2].movement.current.x = 40.0f;
- sphere_object[2].movement.current.y = 40.0f;
- sphere_object[2].movement.current.z = Sphere_Radius;
- sphere_object[2].movement.speed = 0.0f;
- sphere[2].Move(&sphere_object[2].movement.current);
- }
- }
- else if (values.game_type == Countdown)
- {
- values.sphere_speed = 400.0f;
-
- sphere_object[0].goal = true;
- sphere_object[0].seconds_left = -1.0f;
- sphere_object[0].movement.direction = Get_Random(360.0f);
- sphere_object[0].movement.collision.radius = 10.0f;
- sphere_object[0].movement.current.x = 0.0f;
- sphere_object[0].movement.current.y = 0.0f;
- sphere_object[0].movement.current.z = Sphere_Radius;
- sphere_object[0].movement.speed = 0.0f;
- sphere[0].Move(&sphere_object[0].movement.current);
- }
- else
- {
- values.sphere_speed = 250.0f;
- sphere_object[current_sphere].goal = true;
- sphere_object[current_sphere].seconds_left = -1.0f;
- sphere_object[current_sphere].movement.direction = Get_Random(360.0f);
- sphere_object[current_sphere].movement.collision.radius = Sphere_Radius;
-
- if (current_sphere == 0)
- {
- sphere_object[0].movement.current.x = -50.0f;
- sphere_object[0].movement.current.y = 50.0f;
- sphere_object[0].movement.current.z = Sphere_Radius;
- sphere_object[0].movement.speed = 0.0f;
- sphere[0].Move(&sphere_object[0].movement.current);
- }
- else if (current_sphere == 1)
- {
- sphere_object[1].movement.current.x = 50.0f;
- sphere_object[1].movement.current.y = 50.0f;
- sphere_object[1].movement.current.z = Sphere_Radius;
- sphere_object[1].movement.speed = 0.0f;
- sphere[1].Move(&sphere_object[1].movement.current);
- }
- else if (current_sphere == 2)
- {
- sphere_object[2].movement.current.x = 50.0f;
- sphere_object[2].movement.current.y = -50.0f;
- sphere_object[2].movement.speed = 0.0f;
- sphere_object[2].movement.current.z = Sphere_Radius;
- sphere[2].Move(&sphere_object[2].movement.current);
- }
- else if (current_sphere == 3)
- {
- sphere_object[3].movement.current.x = -50.0f;
- sphere_object[3].movement.current.y = -50.0f;
- sphere_object[3].movement.current.z = Sphere_Radius;
- sphere_object[3].movement.speed = 0.0f;
- sphere[3].Move(&sphere_object[3].movement.current);
- }
- }
-
- sphere_object[current_sphere].movement.increment.x = 0.0f;
- sphere_object[current_sphere].movement.increment.y = 0.0f;
- sphere_object[current_sphere].movement.increment.z = 0.0f;
-
- if (current_sphere == 0)
- {
- for (int x1=0;x1<sphere[0].Get_Size();x1=x1+1)
- {
- color3 color = {0.0f/255.0f, 43.0f/255.0f, 200.0f/255.0f};
- sphere[0].Set_Color(x1, &color, &color, &color);
- }
- }
- else if (current_sphere == 1)
- {
- for (int x1=0;x1<sphere[1].Get_Size();x1=x1+1)
- {
- color3 color = {232.0f/255.0f, 0.0f/255.0f, 18.0f/255.0f};
- sphere[1].Set_Color(x1, &color, &color, &color);
- }
- }
- else if (current_sphere == 2)
- {
- for (int x1=0;x1<sphere[2].Get_Size();x1=x1+1)
- {
- color3 color = {255.0f/255.0f, 255.0f/255.0f, 255.0f/255.0f};
- sphere[2].Set_Color(x1, &color, &color, &color);
- }
- }
- else if (current_sphere == 3)
- {
- for (int x1=0;x1<sphere[3].Get_Size();x1=x1+1)
- {
- color3 color = {255.0f/255.0f, 255.0f/255.0f, 55.0f/255.0f};
- sphere[3].Set_Color(x1, &color, &color, &color);
- }
- }
-
- }
-
- /***************************************************************************/
-
- void Next_Position_Sphere(int current_sphere)
-
- {
- float scaled_speed = sphere_object[current_sphere].movement.speed * timing.Get_Scale();
- float movement_increase = sphere_object[current_sphere].movement.collision.radius;
- int x1;
-
- if (sphere_object[current_sphere].movement.speed <= 0.0f)
- sphere_object[current_sphere].movement.speed = 0.0f;
- else
- {
- while (movement_increase == sphere_object[current_sphere].movement.collision.radius)
- {
- if (scaled_speed < sphere_object[current_sphere].movement.collision.radius)
- movement_increase = scaled_speed;
- else
- scaled_speed = scaled_speed - sphere_object[current_sphere].movement.collision.radius;
-
- // Save old position
- sphere_object[current_sphere].movement.previous.x = sphere_object[current_sphere].movement.current.x;
- sphere_object[current_sphere].movement.previous.y = sphere_object[current_sphere].movement.current.y;
-
- // Move current position
- sphere_object[current_sphere].movement.current.x = sphere_object[current_sphere].movement.current.x + scaled_speed;
- sphere_object[current_sphere].movement.current.y = sphere_object[current_sphere].movement.current.y;
-
- Rotate_z(&sphere_object[current_sphere].movement.previous, &sphere_object[current_sphere].movement.current,
- sphere_object[current_sphere].movement.direction);
-
- // Check for collision
- for (x1=0;x1<values.sphere_number;x1=x1+1)
- {
- float temp_angle = 0.0f;
-
- if (current_sphere != x1)
- {
- // Store arrow rotation if needed
- if (sphere_object[x1].goal == true)
- temp_angle = sphere_object[x1].movement.direction;
- else if (sphere_object[current_sphere].goal == true)
- temp_angle = sphere_object[current_sphere].movement.direction;
-
- if (Sphere_Collision_Check(&sphere_object[current_sphere].movement, &sphere_object[x1].movement))
- {
- Sphere_Collision_Calculate(&sphere_object[current_sphere].movement, &sphere_object[x1].movement, 1.0f);
- sphere_object[current_sphere].movement.speed = values.sphere_speed;
- sphere_object[x1].movement.speed = values.sphere_speed;
-
- if (values.sound == true)
- PlaySound("sound/ball.wav", NULL, SND_ASYNC | SND_FILENAME);
- }
-
- // Get arrow rotation if needed
- if (sphere_object[x1].goal == true)
- {
- sphere_object[x1].movement.direction = temp_angle;
- sphere_object[x1].movement.speed = 0.0f;
- }
- else if (sphere_object[current_sphere].goal == true)
- {
- sphere_object[current_sphere].movement.direction = temp_angle;
- sphere_object[current_sphere].movement.speed = 0.0f;
- }
- }
- }
-
- Check_Closest_Points_Sphere(&sphere_object[current_sphere].movement);
-
- if (sphere_object[current_sphere].movement.collision.distance < sphere_object[current_sphere].movement.collision.radius)
- {
- if (sphere_object[current_sphere].movement.collision.edge == true)
- Collision_Edge_2D(&sphere_object[current_sphere].movement);
- else
- {
- float3 temp_from;
- float3 temp_to;
-
- temp_from.x = sphere_object[current_sphere].movement.collision.from_pts.x;
- temp_from.y = sphere_object[current_sphere].movement.collision.from_pts.y;
- temp_to.x = sphere_object[current_sphere].movement.collision.to_pts.x;
- temp_to.y = sphere_object[current_sphere].movement.collision.to_pts.y;
- Collision_Bounce_2D(&temp_from, &temp_to, &sphere_object[current_sphere].movement);
- }
-
- if (values.sound == true)
- PlaySound("sound/wall.wav", NULL, SND_ASYNC | SND_FILENAME);
- }
-
- // Check for goals
- if (sphere_object[current_sphere].movement.current.y > (190.0f - sphere_object[current_sphere].movement.collision.radius - 1.0f))
- {
- sphere_object[current_sphere].goal = true;
- goal_by_team = Up;
-
- if (values.sound == true)
- PlaySound("sound/goal.wav", NULL, SND_ASYNC | SND_FILENAME);
- }
- else if (sphere_object[current_sphere].movement.current.y < (-190.0f + sphere_object[current_sphere].movement.collision.radius + 1.0f))
- {
- sphere_object[current_sphere].goal = true;
- goal_by_team = Down;
-
- if (values.sound == true)
- PlaySound("sound/goal.wav", NULL, SND_ASYNC | SND_FILENAME);
- }
- else if (sphere_object[current_sphere].movement.current.x < (-190.0f + sphere_object[current_sphere].movement.collision.radius + 1.0f))
- {
- sphere_object[current_sphere].goal = true;
- goal_by_team = Left;
-
- if (values.sound == true)
- PlaySound("sound/goal.wav", NULL, SND_ASYNC | SND_FILENAME);
- }
- else if (sphere_object[current_sphere].movement.current.x > (190.0f - sphere_object[current_sphere].movement.collision.radius - 1.0f))
- {
- sphere_object[current_sphere].goal = true;
- goal_by_team = Right;
-
- if (values.sound == true)
- PlaySound("sound/goal.wav", NULL, SND_ASYNC | SND_FILENAME);
- }
-
- // Calculate increment of sphere position
- sphere_object[current_sphere].movement.increment.x = sphere_object[current_sphere].movement.current.x - sphere_object[current_sphere].movement.previous.x;
- sphere_object[current_sphere].movement.increment.y = sphere_object[current_sphere].movement.current.y - sphere_object[current_sphere].movement.previous.y;
- sphere_object[current_sphere].movement.increment.z = 0.0f;
-
- sphere[current_sphere].Move(&sphere_object[current_sphere].movement.increment);
- }
- }
- }
-
- /***************************************************************************/